#pragma once
#include <ctime>
#include <ctime>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <unistd.h>


// 日志等级
enum
{
    Debug = 0, // 测试信息
    Info,      // 通知信息
    Warning,   // 警告信息，不影响程序进行
    Error,     // 错误信息，不影响程序进行
    Fatal,     // 严重错误信息，影响程序进行
    Unknow     // 未知信息
};

// 日志格式
// Debug 日期 文件 行
//  printf("File    Fame: %s\n", __FILE__);      //文件名
//  printf("Present Line: %d\n", __LINE__);      //所在行
//  printf("Present Function: %s\n", __func__);  //函数名
std::string getLevel(int level)
{
    switch (level)
    {
    case Debug:
        return "Debug";
    case Info:
        return "Info";
    case Warning:
        return "Warning";
    case Error:
        return "Error";
    case Fatal:
        return "Fatal";
    default:
        return "Unknow";
    }
}

std::string getTime()
{
    // int tm_sec;   /* Seconds.	[0-60] (1 leap second) */
    // int tm_min;   /* Minutes.	[0-59] */
    // int tm_hour;  /* Hours.	[0-23] */
    // int tm_mday;  /* Day.		[1-31] */
    // int tm_mon;   /* Month.	[0-11] */
    // int tm_year;  /* Year	- 1900.  */
    // int tm_wday;  /* Day of week.	[0-6] */
    // int tm_yday;  /* Days in year.[0-365]	*/
    // int tm_isdst; /* DST.		[-1/0/1]*/
    time_t t = time(nullptr);
    tm *lt = localtime(&t);
    char buf[1024];
    snprintf(buf, sizeof(buf), "%d-%d-%d %d:%d:%d",
             lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
    return buf;
}

void logMessage(int level, const char *format, ...)
{
    char leftMess[1024];
    std::string level_str = getLevel(level);
    std::string tm = getTime();
    // snprintf,将格式输入后，剩余的空间内会被填充\0
    // snprintf(leftMess, sizeof(leftMess), "[%s] [%s] FileName: [%s] Present Line: [%d] ", level_str.c_str(), tm.c_str(), __FILE__, __LINE__);
    // 文件这么加没有用，因为每次日志都是在这里打印日志的，行和文件并不是错误处。
    snprintf(leftMess, sizeof(leftMess), "[%s] [%s]", level_str.c_str(), tm.c_str());

    char rightMess[1024];
    va_list p;                                          // 定义指针p，va_list类似char*
    va_start(p, format);                                // 将p指向可变参数部分的起始处
    vsnprintf(rightMess, sizeof(rightMess), format, p); // 将可变参数输出到rightMess
    va_end(p); // 不用了将指针p置为NULL

    // 1.你可以选择将日志信息直接打印到屏幕上
    printf("%s %s\n", leftMess, rightMess);
    
    // 2.或者你也可以将日志信息保存到文件中

}